package mytest.datenobjekte;

public class Fragebogen {
	/* {author=Lukas Riederle, version=1.0, since=18.11.2009} */

	private int erreichtePunkte = 0;

	private int moeglichePunkte;

	private boolean abgeschlossen;

	private boolean bestanden=false;

	private Frage[] fragen;
	
	private Fragekatalog fragenkatalog;

	private boolean[][] antworten;

	public Fragebogen(Frage[] fragen, Fragekatalog fk) {
		this.fragenkatalog = fk;
		this.fragen = fragen;
		antworten = new boolean[fragen.length][0];
		moeglichePunkte=0;
		for(int frageNummer = 0; frageNummer < antworten.length;frageNummer++ ){
			moeglichePunkte+=fragen[frageNummer].getGesamtpunkte();
		}
		
	}

	public boolean[][] getAntworten() {
		return antworten;
	}

	public Frage[] getFragen() {
		return fragen;
	}
	
	public Fragekatalog getKatalog() {
		return fragenkatalog;
	}

	public boolean isBestanden() {
		bestanden=(getErreichteProzent()>=fragenkatalog.getNoetigeProzent());
		return bestanden;
	}

	public void setAbgeschlossen() {
		if (!abgeschlossen){
			erreichtePunkte=0;
			for(int frageNummer = 0; frageNummer < antworten.length && frageNummer < fragen.length ;frageNummer++ ){
				Frage aktuelleFrage = fragen[frageNummer];
				int erreichteFragepunkte=0;
				boolean frageKomplettRichtig = true;
				for(int antwortNummer = 0; antwortNummer< aktuelleFrage.getAnzahlAnworten() && antwortNummer < antworten[frageNummer].length;antwortNummer++){
					Antwort aktuelleAntwort = aktuelleFrage.getAntworten()[antwortNummer];
					if(aktuelleAntwort.isRichtig()==antworten[frageNummer][antwortNummer]){
						if(aktuelleAntwort.isRichtig()){
						erreichteFragepunkte+=aktuelleAntwort.getPunkte();
						}
					}
					else{
						if(!aktuelleAntwort.isRichtig()){
						erreichteFragepunkte-=aktuelleAntwort.getPunkte();
						}
						frageKomplettRichtig=false;
					}
				}
				if(frageKomplettRichtig){
					erreichteFragepunkte = aktuelleFrage.getGesamtpunkte();
				} else{
					if(erreichteFragepunkte>aktuelleFrage.getGesamtpunkte())
						erreichteFragepunkte = aktuelleFrage.getGesamtpunkte();
				}
				if(erreichteFragepunkte<0)
					erreichteFragepunkte=0;
				erreichtePunkte+=erreichteFragepunkte;
			}
		}
		abgeschlossen = true;
	}
	
	public int getErreichteProzent() {
		return (int) ((double)erreichtePunkte/(double)moeglichePunkte*100);
	}

	public void setAntwort(long frageId, boolean[] antworten) {
		if(!abgeschlossen) {
			for(int i=0;i<fragen.length;i++) {
				if(fragen[i].getId()==frageId) {
					this.antworten[i]=antworten;
					break;
				}
			}
		}
	}
}